/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.osiris.persistence;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Observable;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.apache.log4j.Logger;
import org.osiris.server.engine.EmailNotificacion;
import org.osiris.server.engine.Notificador;




/**
 *
 * @author amartinez
 */
@Entity
@Table(name = "Usuario")
@NamedQueries({@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"), @NamedQuery(name = "Usuario.findByIdUsuario", query = "SELECT u FROM Usuario u WHERE u.idUsuario = :idUsuario"), @NamedQuery(name = "Usuario.findByTelefono", query = "SELECT u FROM Usuario u WHERE u.telefono = :telefono"), @NamedQuery(name = "Usuario.findByNombre", query = "SELECT u FROM Usuario u WHERE u.nombre = :nombre"), @NamedQuery(name = "Usuario.findByEmail", query = "SELECT u FROM Usuario u WHERE u.email = :email"), @NamedQuery(name = "Usuario.findByPrimerApellido", query = "SELECT u FROM Usuario u WHERE u.primerApellido = :primerApellido"), @NamedQuery(name = "Usuario.findBySegundoApellido", query = "SELECT u FROM Usuario u WHERE u.segundoApellido = :segundoApellido"), @NamedQuery(name = "Usuario.findByFechaalta", query = "SELECT u FROM Usuario u WHERE u.fechaalta = :fechaalta"), @NamedQuery(name = "Usuario.findByPerfil", query = "SELECT u FROM Usuario u WHERE u.perfil = :perfil")})
public class Usuario  implements Serializable,java.util.Observer {
    
	@Transient
	Logger logger=Logger.getLogger(this.getClass());
	private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idUsuario")
    private Long idUsuario;
    @Column(name = "Telefono")
    private String telefono;
    @Column(name = "Nombre")
    private String nombre;
    @Column(name = "email")
    private String email;
    @Column(name = "primerApellido")
    private String primerApellido;
    @Column(name = "segundoApellido")
    private String segundoApellido;
    @Column(name = "Fecha_alta")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaalta;
    @Column(name = "Perfil")
    private String perfil;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "responsable", fetch = FetchType.LAZY)
    private List<Requisito> requisitoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "autor", fetch = FetchType.LAZY)
    private List<Requisito> requisitoCollection1;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuarioalta", fetch = FetchType.LAZY)
    private List<Detallerequisito> detallerequisitoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuarioidUsuario", fetch = FetchType.LAZY)
    private List<Proyecto> proyectoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuario", fetch = FetchType.LAZY)
    private List<Requisitosdeproyecto> requisitosdeproyectoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUsuarioalta", fetch = FetchType.LAZY)
    private List<Impactocambio> impactocambioList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuarioalta", fetch = FetchType.LAZY)
    private List<Recursosderequisito> recursosderequisitoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuario", fetch = FetchType.LAZY)
    private List<Asignacionesproyecto> asignacionesproyectoList;
    
    public Usuario() {
    }

    public Usuario(Long idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Long getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(Long idUsuario) {
        this.idUsuario = idUsuario;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPrimerApellido() {
        return primerApellido;
    }

    public void setPrimerApellido(String primerApellido) {
        this.primerApellido = primerApellido;
    }

    public String getSegundoApellido() {
        return segundoApellido;
    }

    public void setSegundoApellido(String segundoApellido) {
        this.segundoApellido = segundoApellido;
    }

    public Date getFechaalta() {
        return fechaalta;
    }

    public void setFechaalta(Date fechaalta) {
        this.fechaalta = fechaalta;
    }

    public String getPerfil() {
        return perfil;
    }

    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }

    public List<Requisito> getRequisitoList() {
        return requisitoList;
    }

    public void setRequisitoList(List<Requisito> requisitoList) {
        this.requisitoList = requisitoList;
    }

    public List<Requisito> getRequisitoCollection1() {
        return requisitoCollection1;
    }

    public void setRequisitoCollection1(List<Requisito> requisitoCollection1) {
        this.requisitoCollection1 = requisitoCollection1;
    }

    public List<Detallerequisito> getDetallerequisitoList() {
        return detallerequisitoList;
    }

    public void setDetallerequisitoList(List<Detallerequisito> detallerequisitoList) {
        this.detallerequisitoList = detallerequisitoList;
    }

    public List<Proyecto> getProyectoList() {
        return proyectoList;
    }

    public void setProyectoList(List<Proyecto> proyectoList) {
        this.proyectoList = proyectoList;
    }

    public List<Requisitosdeproyecto> getRequisitosdeproyectoList() {
        return requisitosdeproyectoList;
    }

    public void setRequisitosdeproyectoList(List<Requisitosdeproyecto> requisitosdeproyectoList) {
        this.requisitosdeproyectoList = requisitosdeproyectoList;
    }

    public List<Impactocambio> getImpactocambioList() {
        return impactocambioList;
    }

    public void setImpactocambioList(List<Impactocambio> impactocambioList) {
        this.impactocambioList = impactocambioList;
    }

    public List<Recursosderequisito> getRecursosderequisitoList() {
        return recursosderequisitoList;
    }

    public void setRecursosderequisitoList(List<Recursosderequisito> recursosderequisitoList) {
        this.recursosderequisitoList = recursosderequisitoList;
    }

    public List<Asignacionesproyecto> getAsignacionesproyectoList() {
        return asignacionesproyectoList;
    }

    public void setAsignacionesproyectoList(List<Asignacionesproyecto> asignacionesproyectoList) {
        this.asignacionesproyectoList = asignacionesproyectoList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idUsuario != null ? idUsuario.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        if ((this.idUsuario == null && other.idUsuario != null) || (this.idUsuario != null && !this.idUsuario.equals(other.idUsuario))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "org.osiris.persistence.Usuario[idUsuario=" + idUsuario + "]";
    }
    
	public void update(Observable o, Object arg) {
		String asunto="Asunto sin identificar";
		String cuerpoPlano="Sin mensaje";
		logger.info("Me han notiicado con :"+o+":soy el usuario:"+this.getIdUsuario());
		if (o instanceof Requisito){
			// a�adir aqui la funcionalidad de mailing
			logger.info("arg:"+arg);
			logger.info("Es un requisito");
			if(arg.toString().equals("EstadoAceptado")){
				asunto="Nuevo Requisito aceptado";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el requisito "+((Requisito)o).getNombre()+", con identificador: "+((Requisito)o).getIdRequisito()+"ha sido aceptado";
			}
			if(arg.toString().equals("NuevaDependencia")){
				asunto="Dependencia creada entre requisitos";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el requisito "+((Requisito)o).getNombre()+", con identificador: "+((Requisito)o).getIdRequisito()+"ha sido asociado a otro requisito.";
			}
			if(arg.toString().equals("RequisitoCreado")){
				asunto="Nuevo Requisito creado";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el requisito "+((Requisito)o).getNombre()+", con identificador: "+((Requisito)o).getIdRequisito()+"ha sido creado.";
			}
			if(arg.toString().equals("NuevoRiesgo")){
				asunto="Nuevo de riesgo en requisito";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el requisito "+((Requisito)o).getNombre()+", con identificador: "+((Requisito)o).getIdRequisito()+"ha creado un riesgos.";
			}
			if(arg.toString().equals("RiesgoEliminado")){
				asunto="Eliminacion de riesgo en requisito";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el requisito "+((Requisito)o).getNombre()+", con identificador: "+((Requisito)o).getIdRequisito()+"ha eliminado uno de sus riesgos.";
			}
			if(arg.toString().equals("Modificacion")){
				asunto="Modificacion de Requisito";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el requisito "+((Requisito)o).getNombre()+", con identificador: "+((Requisito)o).getIdRequisito()+"ha sido modificado.";
			}
			if(arg.toString().equals("Rechazo")){
				asunto="Requisito en estado Rechazado";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el requisito "+((Requisito)o).getNombre()+", con identificador: "+((Requisito)o).getIdRequisito()+"ha sido" +
						" rechazado y que ya no emitira ningun otro mensaje hasta que no cambie de estado.";
			}
			
			
			
			Notificador.colaNotificaciones.add(new EmailNotificacion(asunto, cuerpoPlano, "",this.getEmail()));
			
			logger.info("Soy el usuario "+this.getIdUsuario()+" me han notificado de un cambio en el requisito"+((Requisito)o).getIdRequisito());
		}		
		else if (o instanceof Proyecto){
			
			if(arg.toString().equals("ProyectoCreado")){
				asunto="Nuevo Proyecto creado";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el proyecto "+((Proyecto)o).getNombre()+", con identificador: "+((Proyecto)o).getIdProyecto()+"ha sido creado.";
			}
			if(arg.toString().equals("RequisitoAsociado")){
				asunto="Nuevo Requisito asociado";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el proyecto "+((Proyecto)o).getNombre()+", con identificador: "+((Proyecto)o).getIdProyecto()+"ha sido asociado a un requisito.";
			}
			if(arg.toString().equals("RequisitoDesasociado")){
				asunto="Requisito desasociado";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el proyecto "+((Proyecto)o).getNombre()+", con identificador: "+((Proyecto)o).getIdProyecto()+"ha eliminado un requisito.";
			}
			if(arg.toString().equals("ProyectoCerrado")){
				asunto="Proyecto cerrado";
				cuerpoPlano="Se notifica al usuario: "+this.getNombre()+" que el proyecto "+((Proyecto)o).getNombre()+", con identificador: "+((Proyecto)o).getIdProyecto()+"ha sido" +
						" cerrado y que ya no emitira ningun otro mensaje hasta que no cambie de estado.";
				}
			
			
			Notificador.colaNotificaciones.add(new EmailNotificacion(asunto, cuerpoPlano, "",getEmail()));
			
			logger.info("Soy el usuario "+this.getIdUsuario()+" me han notificado de un cambio en el proyecto"+((Proyecto)o).getIdProyecto());
		}		
	}

}
